package cn.agiledata.bank.linkbank.service;

import java.util.Map;

import cn.agiledata.bank.hibernateBean.Bank;
import cn.agiledata.bank.linkbank.exception.LinkBankException;
import cn.agiledata.bank.linkbank.logic.payment.UnsPayResponse;

public interface BankPayService {
    /**
     * 银行接口：B2C
     */
    public static final String BANK_INTERFACE_B2C = "b2c";

    /**
     * 银行接口：B2B
     */
    public static final String BANK_INTERFACE_B2B = "b2b";

    /**
     * 银行接口：公共事业费
     */
    public static final String BANK_INTERFACE_PUBLIC_FEE = "public";

    /**
     * 获取系统支持的银行清单
     * 
     * @return 系统支持的银行清单
     */
    public Bank[] getSupportedBanks();

    /**
     * 根据银行的返回信息更新交易数据，构建支付系统响应，获取返回给商户的数据
     * 
     * @param bankCode
     *            银行编号
     * @param bankResponseMessages
     *            银行的返回信息
     * @param webRootUrl
     *            web根url
     * @return 支付系统响应，返回给商户的数据
     * @throws LinkBankException
     */
    public UnsPayResponse getUnsPayResponse(String bankCode,
            Map bankResponseMessages, String webRootUrl)
            throws LinkBankException;

    /**
     * 获取支付系统在指定银行的账户密钥
     * 
     * @param bankCode
     *            银行代码
     * @return 支付系统在指定银行的账户密钥
     */
    public String getCryptoKeyOfBank(String bankCode);

    /**
     * 校验指定密钥是否满足指定银行的密钥规则。若指定银行不需要数字签名校验，则认为校验通过
     * 
     * @param bankCode
     *            银行代码
     * @param cryptoKey
     *            密钥
     * @throws LinkBankException
     *             若校验出错，则抛出包含有效密钥规则描述的LinkBankException
     */
    public void validateCryptoKey(String bankCode, String cryptoKey)
            throws LinkBankException;
}